import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'

import { getToken,saveToken } from './token'
import router from '@/router/index.js'
import { Toast } from 'vant';
Vue.use(Toast);

Vue.use(VueAxios, axios)

// 创建一个axios实例，instance，默认有基地址
const instance = axios.create({
  baseURL: 'http://toutiao.itheima.net',
  // timeout: 10000
})

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // config就是我发起请求的配置信息
    // 在发送请求之前做些什么
    // 如果有token则添加请求头
    if (getToken()) {
      // 给配置信息添加请求头
      config.headers.Authorization=`Bearer ${getToken().token}`
      
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    return response
  },
  async function (error) {
    // 手动清除控制台报错
    setTimeout(() => {
        console.clear()
    }, 2000);
    // 对响应错误做点什么
    if (error.response.status == 401) {
        if (getToken()) {
            // 有登录，登录信息过期
            // 这里不能用instance发请求，因为会被拦截加上token，但是token已经过期
            // 还有一个原因instance发起请求携带的是token，这里需要refresh_token
          try {
            let res = await axios({
                url:'http://toutiao.itheima.net/v1_0/authorizations',
                method:'put',
                headers:{
                    'Authorization':`Bearer ${getToken().refresh_token}`
                }
            })
            // console.log(res);
            // 保存新的token
            let obj = getToken()
            obj.token=res.data.data.token
            saveToken(obj)   
            // 用户被拦截前发起的请求要重新给他发送一次
            // instance就是发请求的，error.config里面就保存的是用户被拦截前的请求配置
            return instance(error.config)
          } catch (error) {
            // 没有登录，去登陆
            // 走到这里证明refresh_token也过期了
            // 要重新登录
            Toast.fail('请先登录')
            router.push('/login')
          }
        } else {
            // 没有登录，去登陆
            Toast.fail('请先登录')
            router.push('/login')
        }
    } 
       
    return Promise.reject(error)
  }
)

// 导出instance变量名
export default instance
